From d288a134a427e5728d230404c6a56fc9397b45d9 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Tue, 17 May 2016 13:09:23 +0200 Subject: [PATCH] display: Add vfunc for get_monitor_at_window Some backends (namely Wayland) do not support global coordinates so using the window position to determine the monitor will always fail on such backends. In such cases, the backend itself might be better suited to identify the monitor a given window resides on. Add a vfunc get_monitor_at_window() to the display class so that we can use the backend to retrieve the monitor, if the backend implements it. https://bugzilla.gnome.org/show_bug.cgi?id=766566 --- gdk/gdkdisplay.c | 11 +++++++++++ gdk/gdkdisplayprivate.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 5e2fa873eb..9e638dceec 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -2692,9 +2692,20 @@ gdk_display_get_monitor_at_window (GdkDisplay *display, int n_monitors, i; int area = 0; GdkMonitor *best = NULL; + GdkWindowImplClass *impl_class; + GdkDisplayClass *class; g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + class = GDK_DISPLAY_GET_CLASS (display); + if (class->get_monitor_at_window) + { + best = class->get_monitor_at_window (display, window); + + if (best) + return best; + } + gdk_window_get_geometry (window, &win.x, &win.y, &win.width, &win.height); gdk_window_get_origin (window, &win.x, &win.y); diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h index c8bc7124f8..4b5a009480 100644 --- a/gdk/gdkdisplayprivate.h +++ b/gdk/gdkdisplayprivate.h @@ -246,6 +246,8 @@ struct _GdkDisplayClass GdkMonitor * (*get_monitor) (GdkDisplay *display, int index); GdkMonitor * (*get_primary_monitor) (GdkDisplay *display); + GdkMonitor * (*get_monitor_at_window) (GdkDisplay *display, + GdkWindow *window); /* Signals */ void (*opened) (GdkDisplay *display); -- 2.30.2